﻿#region Copyright Notice
// This file is part of GestionPedago.
// <description>
// Copyright (C) 2012 ENI Ecole Informatique
// 
// GestionPedago is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// <program> is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
#endregion

using System;
using System.Collections.Generic;
using System.Text;
using GestionPedago.EntityContext;
using GestionPedago.Services.Framework;
using GestionPedago.Services.ES.Modele;
using GestionPedago.Persistence.OPManager;
using GestionPedago.EntityContext.EntityOPTools;

namespace GestionPedago.Services.Mapping
{
    /// <summary>
    /// Classe de mapping Entity<->ES de l'objet Titre
    /// </summary>
    public class TitreMappeur : IMappeur<Titre, TitreES>
    {
        /// <summary>
        /// Constructeur
        /// </summary>
        public TitreMappeur() { }

        /// <summary>
        /// Mapping Entity -> ES
        /// </summary>
        /// <param name="entity">L'entity à mapper</param>
        /// <returns>L'ES obtenu</returns>
        public TitreES Entity2ES(Titre entity)
        {
            TitreES retour = new TitreES();
            retour.CodeTitre = entity.CodeTitre;
            retour.LibelleCourt = entity.LibelleCourt;
            retour.LibelleLong = entity.LibelleLong;
            retour.DateCreation = entity.DateCreation;
            retour.TitreENI = entity.TitreENI;
            retour.Archiver = entity.Archiver;
            retour.DateModif = entity.DateModif;
            retour.niveau = entity.niveau;
            retour.codeRome = entity.codeRome;
            retour.codeNSF = entity.codeNSF;
            //TODO implémenter mapping Entity<->ES manuellement ! : Formation
            //TODO implémenter mapping Entity<->ES manuellement ! : PlanningTitreDetail
            retour.ListeActiviteParTitre = new List<ActiviteParTitreES>();
            retour.ListeActivite = new List<ActiviteES>();
            foreach (ActiviteParTitre apt in entity.ActiviteParTitre)
            {
                retour.ListeActivite.Add(new ActiviteMappeur().Entity2ES(apt.GetActivite()));
                retour.ListeActiviteParTitre.Add(new ActiviteParTitreMappeur().Entity2ES(apt));
            }
            return retour;
        }

        /// <summary>
        /// Mapping ES -> Entity
        /// </summary>
        /// <param name="es">L'ES à mapper</param>
        /// <returns>L'entity obtenu</returns>
        public Titre ES2Entity(TitreES es)
        {
            Titre retour = new Titre();
            retour.CodeTitre = es.CodeTitre;
            retour.LibelleCourt = es.LibelleCourt;
            retour.LibelleLong = es.LibelleLong;
            retour.DateCreation = es.DateCreation;
            retour.TitreENI = es.TitreENI;
            retour.Archiver = es.Archiver;
            retour.DateModif = es.DateModif;
            retour.niveau = es.niveau;
            retour.codeRome = es.codeRome;
            retour.codeNSF = es.codeNSF;
            //TODO implémenter mapping Entity<->ES manuellement ! : Formation
            //TODO implémenter mapping Entity<->ES manuellement ! : PlanningTitreDetail
            bool alreadyAttached = !EntityStateChecker.IsDetached(retour);
            if (!alreadyAttached)
            {
                EntityConnection.GetContext().Titre.Attach(retour);
            }

            foreach (ActiviteParTitreES apte in es.ListeActiviteParTitre)
            {
                retour.ActiviteParTitre.Add(new ActiviteParTitreMappeur().ES2Entity(apte));
            }

            foreach (ActiviteES ae in es.ListeActivite)
            {

                ActiviteParTitre apt = new ActiviteParTitre();
                apt.IdActivite = ae.IdActivite;
                apt.CodeTitre = retour.CodeTitre;
                if (!retour.ContientActiviteParTitre(apt))
                {
                    apt = ActiviteParTitreOPManager.AjouterActiviteParTitre(apt);
                    es.ListeActiviteParTitre.Add(new ActiviteParTitreMappeur().Entity2ES(apt));
                }

            }

            List<ActiviteParTitreES> lstActivitesARetirer = new List<ActiviteParTitreES>();

            foreach (ActiviteParTitreES apte in es.ListeActiviteParTitre)
            {
                ActiviteES ae = new ActiviteES();
                ae.IdActivite = apte.IdActivite;
                if (!es.ListeActivite.Contains(ae))
                {
                    lstActivitesARetirer.Add(apte);
                }
            }

            foreach (ActiviteParTitreES apte in lstActivitesARetirer)
            {
                es.ListeActiviteParTitre.Remove(apte);
                ActiviteParTitreOPManager.SupprimerActiviteParTitre(ActiviteParTitreOPManager.GetActiviteParTitreByIdActiviteCodeTitre(apte.IdActivite, apte.CodeTitre));
            }



            if (alreadyAttached)
            {
                EntityConnection.GetContext().Titre.ApplyCurrentValues(retour);
            }


            return retour;
        }
    }
}
